#ifndef __MPU6050_CONFIG_H
#define __MPU6050_CONFIG_H

#include "stm32f10x.h"          // 包含STM32F10x系列外设库定义（寄存器地址、位定义等）
#include "MPU6050_Reg.h"        // 包含MPU6050寄存器地址宏定义（如PWR_MGMT_1=0x6B）
#include "stdbool.h"            // 提供bool类型支持（true/false）
#include "I2C_Config.h"         // 包含I2C总线驱动函数声明（如I2C_Write_Data）
#include "Delay.h"              // 包含延时函数声明（如Delay_ms()）

/**
 * @brief  MPU6050的I2C从设备地址（7位）
 * @note   地址由AD0引脚电平决定：
 *         - AD0接GND → 0x68（默认，本驱动采用此配置）
 *         - AD0接VCC → 0x69（需修改此宏定义）
 * @地址转换：
 *         7位地址需左移1位，最低位表示读写方向：
 *         - 写操作：0x68 << 1 = 0xD0
 *         - 读操作：0x68 << 1 | 1 = 0xD1
 */
#define	MPU6050_SLAVE_ADDRESS	0x68

/**
 * @brief  向MPU6050的指定寄存器写入单字节数据
 * @param  Reg_Address：目标寄存器地址（8位，如PWR_MGMT_1=0x6B、SMPLRT_DIV=0x19）
 * @param  I2C_Data：要写入的8位数据（如0x01表示解除休眠）
 * @retval true：写入成功（I2C总线正常，从机返回ACK）
 *         false：写入失败（超时或从机无应答，需检查硬件连接）
 * @note   底层调用I2C_Write_Data()，自动携带设备地址（MPU6050_SLAVE_ADDRESS）
 *         适用场景：配置传感器参数（量程、采样率等）
 */
bool MPU6050_Write_Data(u8 Reg_Address, u8 I2C_Data);

/**
 * @brief  从MPU6050的指定寄存器读取单字节数据
 * @param  Reg_Address：目标寄存器地址（8位，如WHO_AM_I=0x75、ACCEL_XOUT_H=0x3B）
 * @retval 读取到的8位数据（如0x68表示设备ID正确）
 * @note   底层调用I2C_Read_Data()，自动处理设备地址和读写标志
 *         失败时返回0（需结合寄存器默认值判断，如WHO_AM_I默认值为0x68）
 *         适用场景：读取配置参数、单字节状态信息
 */
u8 MPU6050_Read_Data(u8 Reg_Address);

/**
 * @brief  初始化MPU6050传感器，配置工作模式
 * @note   初始化流程：
 *         1. 上电延时200ms：等待传感器电源稳定（推荐≥100ms）
 *         2. 初始化I2C总线：配置GPIO为复用开漏，I2C速率100kHz
 *         3. 总线稳定延时200ms：等待I2C外设初始化完成
 *         4. 寄存器配置：
 *            - 电源管理：解除休眠（PWR_MGMT_1=0x01），启用所有轴（PWR_MGMT_2=0x00）
 *            - 采样率：100Hz（SMPLRT_DIV=0x09 → 1kHz/(9+1)）
 *            - 滤波器：5Hz带宽（CONFIG=0x06），滤除高频噪声
 *            - 量程：加速度计±16g（ACCEL_CONFIG=0x18），陀螺仪±2000°/s（GYRO_CONFIG=0x18）
 */
void MPU6050_Config(void);

/**
 * @brief  获取MPU6050的设备ID，验证硬件连接
 * @retval 设备ID（8位，正常为0x68）
 * @note   本质是读取WHO_AM_I寄存器（地址0x75），该寄存器固定值为0x68
 *         验证逻辑：
 *         - 返回0x68 → I2C通信正常，传感器连接正确
 *         - 返回其他值 → 接线错误、电源问题或传感器故障
 *         适用场景：系统启动时自检，确认传感器是否可用
 */
u8 MPU6050_GetID(void);

/**
 * @brief  读取MPU6050的六轴原始数据（加速度计+陀螺仪）
 * @param  AccX：X轴加速度数据指针（16位有符号整数，输出参数）
 * @param  AccY：Y轴加速度数据指针（输出参数）
 * @param  AccZ：Z轴加速度数据指针（输出参数）
 * @param  GyroX：X轴陀螺仪数据指针（16位有符号整数，输出参数）
 * @param  GyroY：Y轴陀螺仪数据指针（输出参数）
 * @param  GyroZ：Z轴陀螺仪数据指针（输出参数）
 * @note   数据格式：
 *         - 每个轴数据由两个寄存器组成（高8位+低8位），如AccX = (ACCEL_XOUT_H << 8) | ACCEL_XOUT_L
 *         - 原始值范围：-32768 ~ 32767（16位补码，表示正负方向）
 *         - 物理单位转换公式：
 *           加速度(g) = 原始值 / 2048（±16g量程）
 *           角速度(°/s) = 原始值 / 16.4（±2000°/s量程）
 *         适用场景：实时采集运动数据（如姿态解算、运动检测）
 */
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
                     int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);

#endif /* __MPU6050_CONFIG_H */
